package com.loop.zerocopy;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;

/**
 * @author zhangxiaolu
 * @since 2023-09-07 22:17
 */
public class IOClientBiggerThen8 {

    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new java.net.InetSocketAddress("127.0.0.1", 7001));
        // 得到一个文件channel
        String fileName = "1.txt";
        FileChannel fileChannel = new FileInputStream(fileName).getChannel();
        // 准备发送
        long startTime = System.currentTimeMillis();
        // 总共字节数
        long totalSize = fileChannel.size();
        // windows平台最大传送数据包
        long max_pkg = 8 * 1024 * 1024;
        // 本次传输到的位置
        long cur_pos = 0;
        long transSize = 0;
        // 如果剩余的字节数量 > 8M
        while (totalSize > max_pkg) {
            // 本次传输的字节数
            long tmp = fileChannel.transferTo(cur_pos, max_pkg, socketChannel);
            // 传输后剩余字节数
            totalSize -= tmp;
            // 传输到的位置
            cur_pos += tmp;
            // 已经传输的大小 用于校验
            transSize += tmp;
        }
        // 如果还有剩余,则将剩余一次性传输
        if (totalSize > 0) {
            long tmp = fileChannel.transferTo(cur_pos, totalSize, socketChannel);
            transSize += tmp;
        }
        System.out.println("发送的总的字节数=" + transSize + " 耗时=" + (System.currentTimeMillis() - startTime));
        fileChannel.close();
    }
}
